import java.io.IOException;

/**
 * Classe principale. Point d'entr�e dans le programme. NE PAS MODIFIER CETTE
 * CLASSE. Votre fichier ne sera pas utilis�. Modifiez la classe
 * <code>TSPSolver</code> et, si besoin, cr�ez vos propres classes.
 * 
 * @author Damien Prot, Fabien Lehu�d� 2012
 * 
 */
public class Principale {

  /**
   * M�thode principale. NE PAS MODIFIER CETTE METHODE. Les modifications au
   * programme sont � faire dans la m�thode solve de la classe
   * <code>TSPSolver</code> et, si besoin, cr�ez vos propres classes.
   * Utilisation de l'API : 
   * <br> commande: <code>java Principale [options] datafile</code>
   * <br> Options:
   * <li> -help     : imprime cette aide
   * <li> -t (int)  : temps maximum allou� � la r�solution
   * <li> -v        : trace, niveau d'impression
   * <li> -g        : affichage graphique de la solution
   * <br> 
   * <br> 
   * 
   * @param arg param�tres du programme.
   */
  public static void main(String[] arg) {
    String filename = null;
    long max_time = 30;
    boolean verbose = false;
    boolean graphical = false;

    // --- parse command-line ---
    for (int i = 0; i < arg.length; i++) {
      if (arg[i].compareTo("-help") == 0) {
        System.err.println("Introduction aux techniques d�cisionnelles: cas d'application");
        System.err.println("Le Probl�me du Voyageur de Commerce");
        System.err.println("Utilisation de l'API :");
        System.err.println("commande: java Principale [options] datafile");
        System.err.println("Options:");
        System.err.println("  -help     : imprime cette aide");
        System.err.println("  -t (int)  : temps maximum allou� � la r�solution");
        System.err.println("  -v        : trace, niveau d'impression");
        System.err.println("  -g        : affichage graphique de la solution");

      } else if (arg[i].compareTo("-v") == 0) {
        verbose = true;
      } else if (arg[i].compareTo("-t") == 0) {
        try {
          max_time = Integer.parseInt(arg[++i]);
        } catch (Exception e) {
          System.out.println("erreur : temps invalide pour l'option -t");
          System.exit(1);
        }
      } else if (arg[i].compareTo("-g") == 0) {
        graphical = true;
      } else {
        if (filename != null) {
          System.err.println("erreur : param�tre inconnu ou trop de fichiers de donn�es");
          System.err.println("Param�tre :" + arg[i]);
          System.exit(1);
        }
        filename = arg[i];
      }
    }

    // --- create and solve problems ---
    try {
      TSPSolver tsp = new TSPSolver();
      // create a new problem; data is read from file filename
      Instance prob = new Instance(filename);
      tsp.setInstance(prob);
      tsp.setSolution(new Solution(prob));
      tsp.setTime(max_time);

      // print the data [uncomment if wanted]
      // prob.printData(System.err);

      // solve the problem
      long t = System.currentTimeMillis();
      tsp.solve();
      t = System.currentTimeMillis() - t;

      // evaluate the solution (and check whether it is feasible)

      boolean feasible = tsp.getSolution().validate();

      // sortie du programme: fileName;routeLength;t;e
      // e est un code d'erreur :
      // e = 0 -> solution r�alisable dans les temps
      // e = 1 -> solution non r�alisable
      // e= 2 -> temps dépassé
      int e = 0;
      if (!feasible)
        e = 1;
      else {
        if (t > (max_time + 1) * 1000) {
          e = 2;
          System.err.println("Temps dépassé !!!");
        }
      }
      System.out.println(filename + ";" + tsp.getSolution().getObjectif() + ";" + t + ";" + e);

      // if verbose, print the solution
      if (verbose) {
        prob.print(System.err);
        tsp.getSolution().print(System.err);
        if (e == 1)
          System.err.println("Erreur dans la solution: " + tsp.getSolution().getError());
      }

      // If graphical and no error, draw
      if (feasible && graphical) {
        // Graphical solution
        new Drawing(900, 700, tsp.getSolution());

      }
    } catch (IOException e) {
      System.err.println("Erreur dans la lecture du fichier: " + e.getMessage());
      System.exit(1);
    } catch (Exception e) {
      System.err.printf("error: %s", e.getMessage());
      System.err.println();
      e.printStackTrace(System.err);
      System.exit(1);
    }
    return;
  }
}
